/**
 * 顺序栈实现类
 * 
 * @author 杨满球（本地）
 *
 */
class SequentialStack {
	// 模拟栈的数组
	private Object[] stackElem;
	// 记录已有元素栈的上一位置
	private int top;

	/**
	 * 构造方法
	 * 
	 * @param size
	 *            栈的大小
	 */
	public SequentialStack(int size) {
		this.top = 0;
		this.stackElem = new Object[size];
	}

	/**
	 * 清空栈
	 */
	public void clear() {
		this.top = 0;
	}

	/**
	 * 判断栈是否为空
	 * 
	 * @return 如果栈为空，返回true，否则返回false
	 */
	public boolean isEmpty() {
		if (this.top == 0) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 求栈内元素个数
	 * 
	 * @return 栈内元素的个数
	 */
	public int length() {
		return this.top;
	}

	/**
	 * 取得栈中最后进入的元素
	 * 
	 * @return 栈中最后进入的元素，即栈顶元素
	 */
	public Object peek() {
		if (this.isEmpty()) {
			return null;
		} else {
			return this.stackElem[this.top - 1];
		}
	}

	/**
	 * 一个元素入栈
	 * 
	 * @param data
	 *            需要入栈的元素的值
	 * @throws Exception
	 *             栈已满，无法入栈
	 */
	public void push(Object data) throws Exception {
		if (this.top == this.stackElem.length) {
			throw new Exception("The stack is full!");
		} else {
			this.stackElem[top] = data;
			this.top++;
		}
	}

	/**
	 * 栈顶元素出栈，即返回栈顶元素，并去除栈顶元素
	 * 
	 * @return 栈顶元素的值
	 * @throws Exception
	 *             栈为空
	 */
	public Object pop() throws Exception {
		if (this.top == 0) {
			throw new Exception("The stack is empty!");
		} else {
			this.top--;
			return this.stackElem[top];
		}
	}

	/**
	 * 返回栈的字符串表达形式
	 * 
	 * @return 栈的字符串表达
	 */
	public String getString() {
		if (this.top == 0) {
			return "The stack is empty!";
		} else {
			String stackString = stackElem[top - 1].toString();
			for (int i = top - 2; i >= 0; i--) {
				stackString = stackString + " , " + this.stackElem[i].toString();
			}
			return stackString;
		}
	}

	public int getTop() {
		return top;
	}

	public void setTop(int top) {
		this.top = top;
	}

}
